package com.xyz;

import java.util.ArrayList;
import java.util.Scanner;

public class Player extends Character {
    public Player(String name, int hp, int ap, int sp, int x, int y) {
        super(name, hp, ap, sp);
        this.setX(x);
        this.setY(y);
    }
    // 让角色能够在地图上走动，改为私有，只供 travel 调用
    private void go_to(int to_x, int to_y,Map maps[][]){
        this.setX(to_x);
        this.setY(to_y);
        Map map = maps[this.getX()][this.getY()];
        System.out.println(this.getName()+"长途跋涉，终于来到"+map.getName());
        System.out.println(map.getInfo());
    }

    // 旅行方法，可以通过用户输入控制角色在地图上旅行
    public void travel(Map maps[][]){
        //获取用户输入，用来判定究竟向哪个地图走
        System.out.println("大侠，你想往哪走？(请输入 e(东方)、w(西)、n(北):");
        //用字符串或字符变量，来存储用户输入的方向
        Scanner sc = new Scanner(System.in);
        String direction = sc.next();
        //获取玩家角色的当前坐标
        int x = this.getX();
        int y = this.getY();
        //通过条件分支，根据用户输入，来执行对应的语句
        switch (direction){
            // 东方，x 坐标 +1 ,y 坐标不变
            case "e":

                //先要判断是否出界，
                //向东走，只需要判断 x 是否会超过最大值
                if(x==2){
                    System.out.println("已经到宇宙尽头了！再走就出界了");
                }
                else {
                    //向东走，更新 x 坐标，y 保持不变
                    x+=1;
                    this.go_to(x,y,maps);
                    this.setX(x);
                    this.setY(y);
                }
                break;
            // 西方，x 坐标 -1 ,y 坐标不变
            case "w":

                //先要判断是否出界，
                //向西走，只需要判断 x 是否会超过最大值y
                if(x==0){
                    System.out.println("已经到宇宙尽头了！再走就出界了");
                }
                else {
                    //向西走，更新 x 坐标，y 保持不变
                    x-=1;
                    this.go_to(x,y,maps);
                    this.setX(x);
                    this.setY(y);
                }
                break;
            // 南方，x 坐标不变 ,y 坐标+1
            case "s":
                //先要判断是否出界，
                //向南走，只需要判断 x 是否会超过最大值
                if(y==2){
                    System.out.println("已经到宇宙尽头了！再走就出界了");
                }
                else {
                    //向东走，更新 x 坐标，y 保持不变
                    y+=1;
                    this.go_to(x,y,maps);
                    this.setX(x);
                    this.setY(y);
                }
                break;
            // 南方，x 坐标不变 ,y 坐标 -1
            case "n":
                //先要判断是否出界，
                //向南走，只需要判断 6 是否会超过最大值
                if(y==0){
                    System.out.println("已经到宇宙尽头了！再走就出界了");
                }
                else {
                    //向南走，更新 y 坐标，x 保持不变
                    y-=1;
                    this.go_to(x,y,maps);
                    this.setX(x);
                    this.setY(y);
                }
                break;
            default:
                System.out.println("请输入正确的方向：e/w/n/s");
        }
    }

    // 包含循环逻辑的旅行，完整的用户交互逻辑
    public void do_travel(Map maps[][]){
        do{
            System.out.println("是否要开始旅行？(y/n)：");
            Scanner sc = new Scanner(System.in);
            String s = sc.next();
            // 如果不要继续走了，就跳出循环
            if(s.equals("n")){
                break;
            }
            this.travel(maps);
        }while (true);
    }

    // 看风景
    public void look(Map maps[][]){
        Map m = maps[this.getX()][this.getY()];
        m.print();
    }

    //找怪物
    public void findMonster(Map maps[][])
    {
        Map m = maps[this.getX()][this.getY()];
        m.findMonsters();
    }


    //按回合制在地图中打怪
    // 单一回合，玩家回合打怪
    private void kmOnce(Map map){

        //显示活着的怪物
        System.out.println("还活着的怪物有：");
        //怪物序号，便于用户进行输入选择
        int i = 1;
        ArrayList<Monster> monsters = map.getAliveMonsters();
        for (Monster monster:monsters) {
            //打印序号
            System.out.println(i);
            //打印怪物信息
            monster.print();
            i++;
        }
        System.out.println("请选择攻击方式(r/s)：   *注：r为普通攻击，s为技能攻击");
        Scanner s= new Scanner(System.in);
        //获取玩家选择的攻击类型
        String attachType = s.next();
        switch (attachType){
            //普通攻击，设定普通攻击是单体攻击，必须选择某一个怪物
            case "r":
                System.out.println(this.getName()+"使用普通攻击");
                System.out.println("请选择攻击对象：(输入上面怪物对应的数字)");
                int n = s.nextInt();
                int x = 1;
                Monster m = null;
                for (Monster monster:monsters) {
                    if(monster.getHp()>0){
                        if(x==n){
                            m=monster;
                        }
                        x++;
                    }
                }
                if(m!=null) {
                    this.attack(m);
                }
                break;
            // 技能攻击
            case "s":
                System.out.println(this.getName()+"使用技能攻击");
                //技能单体攻击
                //我设定的技能攻击类型有两个，一个是 s Single（单攻）
                //还有一个是群攻：m 英文复数的缩写
                if(this.getSkill().getAttackType()=="s")
                {
                    System.out.println("请选择攻击对象：(输入上面怪物对应的数字)");
                    int n1 = s.nextInt();
                    int x1 = 1;
                    Monster m1 = null;
                    for (Monster monster:monsters) {
                        if(monster.getHp()>0){
                            if(x1==n1){
                                m1=monster;
                            }
                            x1++;
                        }
                    }
                    if(m1!=null) {
                        this.getSkill().attack(m1);
                    }
                }
                //不是单攻，就是群体攻击，攻击所有
                else {
                    this.skillAttackAll(monsters);
                }
                break;
            default:
                System.out.println("攻击方式输入错误！");
        }
    }

    //地图中多回合打怪逻辑
    //对应于 km 命令
    public void km(Map map){
        if(map.getMonsters()==null)
        {
            System.out.println("图中并无怪物！");
            return;
        }
        if(map.getAliveMonsters()==null)
        {
            System.out.println("图中并无活着的怪物！");
            return;
        }
        if(map.getAliveMonsters().isEmpty())
        {
            System.out.println("图中并无活着的怪物！");
            return;
        }
        int i = 1;
        //暂不考虑速度，假设都是玩家先出手
        while(true){
            System.out.println("#######################################");
            System.out.println("              第"+i+"回合               ");
            System.out.println("#######################################");

            //回合开始
            //玩家先打怪
            kmOnce(map);
            //玩家出手后，判断是否还有活着的怪物，如果没有，直接跳出
            if(map.getAliveMonsters().isEmpty())
            {
                System.out.println("全图怪物打完了！");
                return;
            }
            //活着的怪物还手打玩家
            for (Monster m:map.getAliveMonsters()) {
                m.attack(this);
                //每个怪物打完后，要判断玩家是否存活，不能鞭尸
                if(this.getHp()<=0){
                    return;
                }
            }
            i++;
        }
    }
}
